# -*- coding: utf-8 -*- 
"""
========================================================================================================================
@project : AosSanic
@file: OAsyncCall
@Author: mengying
@email: 652044581@qq.com
@date: 2023/4/3 11:08
@desc: O2OA的异步io转多线程的情况
       因为整个sanic框架异步的,OA是同步的无法兼容，由于时间关系， 做了一个异步io转多线程的情况，
       希望后来者可以参考paas封装利用requests_async，重新封装该接口
========================================================================================================================
"""
import time
from threading import Thread
import asyncio


class MyThread(Thread):

    def __init__(self, func, args=()):
        super(MyThread, self).__init__()
        self.func = func
        self.args = args
        self.result = None

    def run(self):
        self.result = self.func(*self.args)


    def get_result(self):
        return self.result



def async2Thread(func, args, nowait=False):
    t = MyThread(func, args)
    t.start()

    if not nowait:
        t.join()
        result = t.get_result()

        if not result:
            raise Exception("O2OA错误")

        return result


# ==============================================以下为测试用例=============================================================
def test():
    time.sleep(3)
    print("task done")
    return "task done"


async def main():
    # 不需要等待结果
    async2Thread(func=test, args=(), nowait=True)

    # 需要等待结果
    result = async2Thread(func=test, args=())
    print(result)


if __name__ == '__main__':
    asyncio.run(main())
